package document

import (
	"fmt"

	"xorm.io/xorm"
)

// FileInfoDAO 文件信息数据访问对象
type FileInfoDAO struct {
	db *xorm.Engine
}

// NewFileInfoDAO 创建文件信息DAO实例
func NewFileInfoDAO(db *xorm.Engine) *FileInfoDAO {
	return &FileInfoDAO{db: db}
}

// Create 创建文件信息
func (dao *FileInfoDAO) Create(fileInfo *FileInfo) error {
	_, err := dao.db.Insert(fileInfo)
	return err
}

// GetByID 根据ID获取文件信息
func (dao *FileInfoDAO) GetByID(id int) (*FileInfo, error) {
	fileInfo := &FileInfo{}
	has, err := dao.db.ID(id).Get(fileInfo)
	if err != nil {
		return nil, err
	}
	if !has {
		return nil, fmt.Errorf("文件信息不存在")
	}
	return fileInfo, nil
}

// GetByFileName 根据文件名获取文件信息
func (dao *FileInfoDAO) GetByFileName(fileName string) (*FileInfo, error) {
	fileInfo := &FileInfo{}
	has, err := dao.db.Where("file_name = ?", fileName).Get(fileInfo)
	if err != nil {
		return nil, err
	}
	if !has {
		return nil, fmt.Errorf("文件信息不存在")
	}
	return fileInfo, nil
}

// Update 更新文件信息
func (dao *FileInfoDAO) Update(fileInfo *FileInfo) error {
	_, err := dao.db.ID(fileInfo.ID).Update(fileInfo)
	return err
}

// Delete 删除文件信息
func (dao *FileInfoDAO) Delete(id int) error {
	_, err := dao.db.ID(id).Delete(&FileInfo{})
	return err
}

// List 获取文件信息列表
func (dao *FileInfoDAO) List(pageNum, pageSize int, fileName, fileAuthor string) ([]*FileInfo, int64, error) {
	var fileInfos []*FileInfo
	session := dao.db.NewSession()

	// 添加查询条件
	if fileName != "" {
		session = session.Where("file_name LIKE ?", "%"+fileName+"%")
	}
	if fileAuthor != "" {
		session = session.Where("file_author LIKE ?", "%"+fileAuthor+"%")
	}

	// 获取总数
	total, err := session.Count(&FileInfo{})
	if err != nil {
		return nil, 0, err
	}

	// 获取分页数据
	err = session.OrderBy("created_at DESC").Limit(pageSize, (pageNum-1)*pageSize).Find(&fileInfos)
	if err != nil {
		return nil, 0, err
	}

	return fileInfos, total, nil
}

// CreateTable 创建文件信息表
func (dao *FileInfoDAO) CreateTable() error {
	return dao.db.Sync2(new(FileInfo))
}
